package com.easyadmin.pro.modules.sys.service.impl;

import com.easyadmin.pro.common.constants.StatusConstants;
import com.easyadmin.pro.common.enums.HttpCodeEnum;
import com.easyadmin.pro.common.exception.BusinessException;
import com.easyadmin.pro.modules.sys.entity.DictEntity;
import com.easyadmin.pro.modules.sys.entity.DictItemEntity;
import com.easyadmin.pro.modules.sys.mapper.DictItemMapper;
import com.easyadmin.pro.modules.sys.mapper.DictMapper;
import com.easyadmin.pro.modules.sys.query.DictQuery;
import com.easyadmin.pro.modules.sys.rest.DictResult;
import com.easyadmin.pro.modules.sys.service.IDictService;
import com.easyadmin.pro.modules.sys.vo.DictVo;
import com.easyadmin.pro.modules.sys.vo.TableSchemaInfoVo;
import com.easyadmin.pro.tool.DictGeneratorUtils;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.List;

/**
 *  服务层实现。
 *
 * @author xulin
 * @since 2024-08-19
 */
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class DictServiceImpl extends ServiceImpl<DictMapper, DictEntity> implements IDictService {

    private final DictGeneratorUtils dictGeneratorUtils;

    private final DictItemMapper dictItemMapper;

    @Override
    public void generatorDict(DictVo dictVo) {
        DictEntity dictEntity = new DictEntity();
        BeanUtils.copyProperties(dictVo, dictEntity);
        // 生成字典
        dictGeneratorUtils.generatorDict(dictVo.getDictCode(), dictVo.getDictName());
        dictEntity.setStatus(Integer.valueOf(StatusConstants.STATUS_1));
        mapper.insert(dictEntity);
        DictItemEntity dictItemEntity = new DictItemEntity();
        dictItemEntity.setDictId(dictEntity.getId());
        dictItemEntity.setDictItemName("主键");
        dictItemEntity.setDictItemCode("id");
        dictItemEntity.setDictItemType("bigint");
        dictItemEntity.setDictItemSize(32);
        dictItemEntity.setRequired(StatusConstants.STATUS_1);
        dictItemEntity.setStatus(Integer.valueOf(StatusConstants.STATUS_1));
        dictItemMapper.insert(dictItemEntity);

    }

    @Override
    public void removeDict(Serializable id) {
        DictEntity dictEntity = mapper.selectOneById(id);
        dictGeneratorUtils.deleteDict(dictEntity.getDictCode());
        mapper.delete(dictEntity);
        dictItemMapper.deleteByQuery(new QueryWrapper().eq(DictItemEntity::getDictId, id));
    }

    @Override
    public void checkDictInformation(Serializable id) {
        DictEntity dictEntity = mapper.selectOneById(id);
        String dictCode = dictEntity.getDictCode();
        int num = mapper.selectInfos(dictCode);
        if (num > 0) {
            throw new BusinessException(HttpCodeEnum.SYSTEM_ERROR, "此字典存在数据，不能删除！");
        }
    }

    @Override
    public void removeData(Serializable id) {
        DictEntity dictEntity = mapper.selectOneById(id);
        String dictCode = dictEntity.getDictCode();
        mapper.removeData(dictCode);
    }

    @Override
    public List<TableSchemaInfoVo> selectDictInformation(String dataSourceName) {
        return mapper.selectDictInformation(dataSourceName);
    }

    @Override
    public List<DictResult> queryPage(DictQuery dictQuery) {
        return mapper.queryPage(dictQuery);
    }

}
